/**
 * 时间复杂度：？？？
 **/
#include <bits/stdc++.h>
using namespace std;
const int maxm = 1e6 + 7;
int N, D, M;
int job[maxm];
vector<int> day[maxm];
struct node {
  int num, time;
};
bool check(int x) {
  if (!x) return false;  // 特判一下x=0的情况，否则，二分的左边界不能为0
  // 具体原因是，x=0可以完美地绕过下边的测试而抵达return true
  queue<node> q;                  // 用于推迟某天内完不成的任务
  for (int i = 1; i <= N; ++i) {  // 这道N只有100，非常小
    int mach = x;                 // 今天的机器数；每天一开始都是x
    while (q.size()) {
      auto [num, time] = q.front();
      q.pop();
      if (time + D < i) {  // 超过时间限制
        return false;
      }
      --mach;
      if (!mach) break;  // 机器数为0
    }
    if (q.size()) {
      auto [num, time] = q.front();
      if (time + D < i) return false;
    }
    for (auto v : day[i]) {
      if (mach)
        --mach;
      else {
        q.push({v, i});
      }
    }
  }
  return true;
}
int main() {
  cin >> N >> D >> M;
  for (int i = 1; i <= M; ++i) {
    cin >> job[i];
    day[job[i]].push_back(i);
  }
  int lo = 0, hi = M, res = -1;
  while (lo <= hi) {
    int mid = (lo + hi) / 2;
    // cout << mid << endl;
    if (check(mid)) {
      res = mid;
      hi = mid - 1;
    } else {
      lo = mid + 1;
    }
  }
  cout << res << endl;
}
